package com.ppt.javappt.entity;
import javafx.scene.Node;
import javafx.beans.value.ChangeListener;
import java.util.ArrayList;
import java.util.List;


/**
 * 节点监听器管理器：统一管理所有节点属性处理器，自动匹配节点类型
 * @author cys
 */
public class NodeListenerManager {
    // 存储所有注册的处理器（包括通用和特定类型）
    private final List<NodePropertyHandler> handlers = new ArrayList<>();

    // 初始化：注册所有处理器
    public NodeListenerManager() {
        // 注册通用处理器
        handlers.add(new CommonNodePropertyHandler());
        // 注册特定类型处理器
        handlers.add(new TextBoxPropertyHandler());
        // 新增节点类型时，只需在这里添加新的处理器，如：
        // handlers.add(new LabelPropertyHandler());
    }

    /**
     * 为节点添加所有适用的属性监听器
     * @param node 目标节点
     * @param listener 通用的属性变化监听器
     */
    public void addListeners(Node node, ChangeListener<Object> listener) {
        // 遍历所有处理器，找到支持该节点的处理器并执行添加逻辑
        for (NodePropertyHandler handler : handlers) {
            if (handler.supports(node)) {
                handler.addPropertyListeners(node, listener);
            }
        }
    }

    /**
     * 从节点移除所有适用的属性监听器
     * @param node 目标节点
     * @param listener 通用的属性变化监听器
     */
    public void removeListeners(Node node, ChangeListener<Object> listener) {
        // 遍历所有处理器，找到支持该节点的处理器并执行移除逻辑
        for (NodePropertyHandler handler : handlers) {
            if (handler.supports(node)) {
                handler.removePropertyListeners(node, listener);
            }
        }
    }
}